home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 41
/
Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso
/
Aminet
/
misc
/
sci
/
Denise4_2.lha
/
Denise4_2
/
source
/
include
/
grama2.cpp
< prev
next >
Wrap
Text File
|
2000-11-04
|
16KB
|
479 lines
/*
Denise-MYTH Artificial Intelligence.
Copyright (C) 2000 Szymon Jessa
WERSJA ANGIELSKA:
This program is free software; you can redistribute it and/or modify it under the terms of the GNU
General Public License as published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not,
write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
WERSJA POLSKA:
Niniejszy program jest oprogramowaniem wolnodostëpnym; moûesz go rozprowadzaê dalej i/lub
modyfikowaê na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacjë Wolnodostëpnego
Oprogramowania - wedîug wersji 2-giej tej Licencji lub którejô z póúniejszych wersji.
Niniejszy program rozpowszechniany jest z nadziejâ, iû bëdzie on uûyteczny - jednak BEZ
JAKIEJKOLWIEK GWARANCJI, nawet domyôlnej gwarancji PRZYDATNOÔCI HANDLOWEJ albo PRZYDATNOÔCI DO
OKREÔLONYCH ZASTOSOWAÏ. W celu uzyskania bliûszych informacji - Powszechna Licencja Publiczna GNU.
Z pewnoôciâ wraz z niniejszym programem otrzymaîeô teû egzemplarz Powszechnej Licencji Publicznej
GNU; jeôli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
KONTAKT:
snail: Szymon Jessa, ul. Warszawska 20/6, 89-600 Chojnice,
email: smoczek@ue.eti.pg.gda.pl (ew. noco@box43.gnet.pl)
phone: (052) 39-707-88
****************************************************************************************************
*/
/*
KOMENTARZE:
? - oznacza, ûe dany warunek nie jest na 100% poprawny gramatycznie
// - oznacza, ûe dany warunek nie jest uwzglëdniony w funkcji
*/
// *************************
// * * * P O D M I O T * * *
// *************************
char FROM czy_podmiot(char nr_grupy)
{
// nie przeprowadza sië kontroli, czy wyraz jest nieokreôlony,
// bo nie ma to sensu - nie wymaga komentarza...
// podmiot musi byê grupâ z poziomu 0
if (skladnia.poziom[nr_grupy]!=0) return RESULT_NO_OK;
// podmiot musi skîadaê sië z jednego wyrazu
if (grupa[nr_grupy].ile_wyrazow>1) return RESULT_NO_OK;
switch (*ptr_czesc_mowy(grupa[nr_grupy].dane))
{
// jeôli jest rzeczownikiem
case RZECZOWNIK:
// musi byê zaîoûony podmiot okreôlony
if (skladnia.typ_podmiotu!=PODMIOT_OKRESLONY) return RESULT_NO_OK;
// musi byê w mianowniku lub dopeîniacziu
if (*ptr_przypadek(grupa[nr_grupy].dane)!=MIANOWNIK && *ptr_przypadek(grupa[nr_grupy].dane)!=DOPELNIACZ) return RESULT_NO_OK;
return RESULT_OK;
// jeôli jest zaimkiem rzeczownym
case ZAIMEK_RZECZOWNY:
// musi byê zaîoûony podmiot zaimkowy
if (skladnia.typ_podmiotu!=PODMIOT_ZAIMKOWY) return RESULT_NO_OK;
// musi byê zaimkiem osobowym lub pytajâcym
switch (*ptr_zaimek_funkcja(grupa[nr_grupy].dane))
{
// zaimek osobowy/pytajâcy (zwykle "kto/co")
case ZAIMEK_OSOBOWY:
case ZAIMEK_PYTAJACY:
break;
// w przeciwnym razie
deafult: return RESULT_NO_OK;
}
// musi byê w mianowniku lub dopeîniacziu
if (*ptr_przypadek(grupa[nr_grupy].dane)!=MIANOWNIK && *ptr_przypadek(grupa[nr_grupy].dane)!=DOPELNIACZ) return RESULT_NO_OK;
return RESULT_OK;
// jeôli jest bezokolicznikiem
case BEZOKOLICZNIK:
// musi byê zaîoûony podmiot okreôlony
if (skladnia.typ_podmiotu!=PODMIOT_ZAIMKOWY) return RESULT_NO_OK;
return RESULT_OK;
// jeôli jest innâ czëôciâ mowy
default:
return RESULT_NO_OK;
}
}
char FROM podmiot(void)
{
/*
podmiot jest nadrzëdnâ czëôciâ zdania i niczego nie okreôla
warunek ogólny:
- podmiot nie ma wyrazu nadrzëdnego
? - podmiot skîada sië z jednego wyrazu
podmiot to czëôê mowy:
- rzeczownik
- w mianowniku lub w dopeîniaczu
- zaimek rzeczowny
- osobowy
- w mianowniku lub w dopeîniaczu
- bezokolicznik
podmiot moûe byê:
- bezpoôrednio okreôlony
- zaimkowy (DENISE, ROZMÓWCA, TEMAT)
- domyôlny (DENISE, ROZMÓWCA, TEMAT)
*/
char nr_grupy;
switch (skladnia.typ_podmiotu)
{
case PODMIOT_OKRESLONY:
case PODMIOT_ZAIMKOWY:
for (nr_grupy=0;nr_grupy<sentence.ile_grup;nr_grupy++)
{
if (czy_podmiot(nr_grupy)==RESULT_OK)
{
skladnia.funkcja[nr_grupy]=PODMIOT;
skladnia.podmiot=nr_grupy;
return RESULT_OK;
}
}
return RESULT_NO_OK;
case PODMIOT_DOMYSLNY: return RESULT_OK;
default: con_put("bîâd: podmiot bîëdnie zdefiniowany\n"); return RESULT_NO_OK;
}
}
// **********************************************
// * * * O R Z E C Z E N I E I M I E N N E * * *
// **********************************************
char FROM czy_lacznik(char nr_grupy)
{
// nie przeprowadza sië kontroli, czy wyraz jest nieokreôlony,
// bo nie ma to sensu - tylko podmiot zostaî do tej pory okreôlony
// nadrzëdna grupa musi byê podmiotem w zdaniu, czyli wyraz MUSI
// byê na poziomie 1, nie innym
if (skladnia.poziom[nr_grupy]!=1) return RESULT_NO_OK;
// musi to byê czasownik osobowy
if (*ptr_czesc_mowy(grupa[nr_grupy].dane)!=CZASOWNIK_OSOBOWY) return RESULT_NO_OK;
// musi to byê wyraz: byê,(staê sië),zostaê
if (cmp_wyraz_podst(nr_grupy,"byê")==RESULT_NO_OK && cmp_wyraz_podst(nr_grupy,"zostaê")==RESULT_NO_OK) return RESULT_NO_OK;
// jeôli to forma "to"
if (cmp_wyraz_odm(nr_grupy,"to")==RESULT_OK)
{
// to musi staê ZA podmiotem
if (nr_grupy<skladnia.podmiot) return RESULT_NO_OK;
}
// zaleûnie od tego jakâ czëôciâ mowy jest podmiot róûne warunki
switch (get_czesc_mowy_podmiot())
{
case RZECZOWNIK:
case ZAIMEK_RZECZOWNY: // dziëki *ptr_ moûna stosowaê ogólne funkcje
// czy liczba zgodna z podmiotem
if (*ptr_liczba(grupa[nr_grupy].dane)!=get_liczba_podmiot()) return RESULT_NO_OK;
// czy rodzaj zgodny z podmiotem (dla czasu nie teraúniejszego)
if (*ptr_czas(grupa[nr_grupy].dane)!=CZAS_TERAZNIEJSZY)
{
// liczba pojedyncza i mnoga osobno
if (rodzaj_zgodny(*ptr_czesc_mowy(grupa[nr_grupy].dane),*ptr_liczba(grupa[nr_grupy].dane),*ptr_rodzaj(grupa[nr_grupy].dane),
get_czesc_mowy_podmiot(),get_liczba_podmiot(),get_rodzaj_podmiot())==RESULT_NO_OK) return RESULT_NO_OK;
}
return RESULT_OK;
case BEZOKOLICZNIK:
// czasownik musi byê w 3 osobie
if (*ptr_osoba(grupa[nr_grupy].dane)!=3) return RESULT_NO_OK;
// czasownik w liczbie pojedynczej
if (*ptr_liczba(grupa[nr_grupy].dane)!=1) return RESULT_NO_OK;
return RESULT_OK;
}
return RESULT_NO_OK;
}
char FROM lacznik(void)
{
/*
îâcznik okreôla czëôê zdania:
- podmiot
warunek ogólny:
- îâcznik moûe byê tylko jeden
îâcznik to czëôê mowy:
- czasownik osobowy: byê,(staê sië),zostaê ("to" - jest formâ "byê")
<gdy jest to forma "to">
- musi staê ZA podmiotem
<gdy okreôla podmiot - rzeczownik>
- ta sama liczba co rzeczownik
- ten sam rodzaj, ale:
- w czasie terazniejszym czasownik nie uwzglednia rodzaju
- w liczbie mnogiej czasownika tylko dwa rodzaje
<gdy okreôla podmiot - zaimek rzeczowny>
- ta sama liczba co zaimek
- ten sam rodzaj, ale:
- w czasie terazniejszym czasownik nie uwzglednia rodzaju
- w liczbie mnogiej czasownika tylko dwa rodzaje
- osoba zgodna z osobâ odpowiadajâcâ zaimkowi
<gdy okreôla podmiot - bezokolicznik>
- musi byê w 3 osobie
- musi byê w liczbie pojedynczej
*/
char founded=0,nr_grupy;
for (nr_grupy=0;nr_grupy<sentence.ile_grup;nr_grupy++)
{
if (czy_lacznik(nr_grupy)==RESULT_OK)
{
// îâcznik moûe byê tylko jeden (jak nieômiertelny)
if (founded==1)
{
if (view.skladnia==KOD_TRUE) con_put("bîâd: odnaleziono nadmiarowe îâczniki\n");
return RESULT_NO_OK;
}
founded=1;
skladnia.funkcja[nr_grupy]=LACZNIK;
skladnia.orzeczenie=nr_grupy;
}
}
if (founded==1) return RESULT_OK;
return RESULT_NO_OK;
}
char FROM czy_orzecznik(char nr_grupy)
{
// nie przeprowadza sië kontroli, czy wyraz jest nieokreôlony,
// bo nie ma to sensu - spowolniîoby to rozbiór na tym etapie
// orzecznik skîadaê sië musi z jednego wyrazu
if (grupa[nr_grupy].ile_wyrazow>1) return RESULT_NO_OK;
// nadrzëdna grupa musi byê îâcznikiem
if (skladnia.zwiazek[nr_grupy]!=skladnia.orzeczenie) return RESULT_NO_OK;
switch (*ptr_czesc_mowy(grupa[nr_grupy].dane))
{
// jeôli to rzeczownik lub wyraûenie przyimkowe lub zaimek rzeczowny
case RZECZOWNIK:
case ZAIMEK_RZECZOWNY:
// jeôli to sam rzeczownik lub zaimek rzeczowny, bez przyimka
if (grupa[nr_grupy].ile_wyrazow==1)
{
// w przypadku narzuconym przez îâcznik
if (*ptr_przypadek(grupa[nr_grupy].dane)!=get_przyp_narzuc_orzeczenie()) return RESULT_NO_OK;
return RESULT_OK;
}
// jeôli to rzeczownik lub zaimek rzeczowny z przyimkiem
else
{
// stoi za orzeczeniem
if (nr_grupy<skladnia.orzeczenie) return RESULT_NO_OK;
return RESULT_OK;
}
// jeôli to przymiotnik lub zaimek przymiotny lub imiesîów przymiotnikowy
case PRZYMIOTNIK:
case ZAIMEK_PRZYMIOTNY:
case IMIESLOW_PRZYMIOTNIKOWY:
// îâcznik nie moûe byê czasownikiem 'to' (byê)
if (cmp_wyraz_odm(skladnia.orzeczenie,"to")==RESULT_OK) return RESULT_NO_OK;
// podmiot musi byê rzeczownikiem lub zaimkiem rzeczownym
if (get_czesc_mowy_podmiot()!=RZECZOWNIK && get_czesc_mowy_podmiot()!=ZAIMEK_RZECZOWNY) return RESULT_NO_OK;
// POZYCJA W ZDANIU
switch (sentence.oznajm_pyt)
{
case ZDANIE_OZNAJMUJACE:
// poîoûenie wzglëdem orzeczenia/îâcznika:
// orzecznik musi staê za îâcznikiem
if (nr_grupy<skladnia.orzeczenie) return RESULT_NO_OK;
break;
case ZDANIE_PYTAJACE:
// jeôli to nie jest zaimek i jeôli podmiot okreôlony
if (*ptr_czesc_mowy(grupa[nr_grupy].dane)==PRZYMIOTNIK && skladnia.typ_podmiotu==PODMIOT_OKRESLONY)
{
// orzecznik musi staê za îâcznikiem
if (nr_grupy<skladnia.orzeczenie) return RESULT_NO_OK;
// orzecznik musi staê za podmiotem
if (nr_grupy<skladnia.podmiot) return RESULT_NO_OK;
}
break;
}
// musi byê w MIANOWNIKU
if (*ptr_przypadek(grupa[nr_grupy].dane)!=MIANOWNIK) return RESULT_NO_OK;
// ta sama liczba, co podmiot
if (*ptr_liczba(grupa[nr_grupy].dane)!=get_liczba_podmiot()) return RESULT_NO_OK;
// ten sam rodzaj co podmiot, ale uwaga na liczbë mnogâ
if (*ptr_liczba(grupa[nr_grupy].dane)==LICZBA_POJEDYNCZA)
{
// liczba pojedyncza i mnoga osobno
if (rodzaj_zgodny(*ptr_czesc_mowy(grupa[nr_grupy].dane),*ptr_liczba(grupa[nr_grupy].dane),*ptr_rodzaj(grupa[nr_grupy].dane),
get_czesc_mowy_podmiot(),get_liczba_podmiot(),get_rodzaj_podmiot())==RESULT_NO_OK) return RESULT_NO_OK;
}
return RESULT_OK;
// jeôli to przysîówek
case PRZYSLOWEK:
// podmiotem musi byê bezokolicznik
if (get_czesc_mowy_podmiot()!=BEZOKOLICZNIK) return RESULT_NO_OK;
return RESULT_OK;
// jeôli to inna czëôê mowy
default:
return RESULT_NO_OK;
}
}
char FROM orzecznik(void)
{
/*
orzecznik okreôla czëôê zdania:
- îâcznik
warunek ogólny:
- orzecznik moûe byê tylko jeden
? - skîada sië tylko z jednego wyrazu
- jako orzecznik przyjmowana jest pierwsza grupa, która speînia pewne warunki
orzecznik to czëôê mowy:
- rzeczownik lub zaimek rzeczowny
- w przypadku narzuconym przez îâcznik
//? - ten sam rodzaj co podmiot
- wyraûenie przyimkowe
- stoi za îâcznikiem
- przymiotnik lub zaimek przymiotny lub imiesîów przymiotnikowy
<gdy podmiotem jest rzeczownik>
- nie, jeôli îâcznik jest typu 'to',
- stoi za îâcznikiem
- przypadek MIANOWNIK
- ta sama liczba co podmiot
- ten sam rodzaj, ale:
- w liczbie mnogiej przymiotnik ma tylko dwa rodzaje
<gdy podmiotem jest zaimek rzeczowny>
- stoi za îâcznikiem
- przypadek MIANOWNIK
- ta sama liczba co podmiot
- ten sam rodzaj, ale:
- w liczbie mnogiej przymiotnik ma tylko dwa rodzaje
- przysîówek
<gdy okreôla bezokolicznik>
// - liczebnik
*/
char nr_grupy;
for (nr_grupy=0;nr_grupy<sentence.ile_grup;nr_grupy++)
{
if (czy_orzecznik(nr_grupy)==RESULT_OK)
{
skladnia.funkcja[nr_grupy]=ORZECZNIK;
return RESULT_OK;
}
}
return RESULT_NO_OK;
}
// ********************************************************
// * * * O R Z E C Z E N I E C Z A S O W N I K O W E * * *
// ********************************************************
char FROM czy_orzeczenie_czasownikowe(char nr_grupy)
{
// nadrzëdnâ grupâ musi byê podmiot, czyli poziom koniecznie 1
if (skladnia.poziom[nr_grupy]!=1) return RESULT_NO_OK;
// musi to byê czasownik osobowy
if (*ptr_czesc_mowy(grupa[nr_grupy].dane)!=CZASOWNIK_OSOBOWY) return RESULT_NO_OK;
switch (get_czesc_mowy_podmiot())
{
// jeôli okreôla rzeczownik lub zaimek rzeczowny
case RZECZOWNIK:
case ZAIMEK_RZECZOWNY:
// liczba zgodna z podmiotem
if (*ptr_liczba(grupa[nr_grupy].dane)!=get_liczba_podmiot()) return RESULT_NO_OK;
// czy rodzaj zgodny z podmiotem (dla czasu nie terazniejszego)
if (*ptr_czas(grupa[nr_grupy].dane)!=CZAS_TERAZNIEJSZY)
{
// liczba pojedyncza i mnoga osobno
if (*ptr_liczba(grupa[nr_grupy].dane)==LICZBA_POJEDYNCZA)
{
// liczba pojedyncza i mnoga osobno
if (rodzaj_zgodny(*ptr_czesc_mowy(grupa[nr_grupy].dane),*ptr_liczba(grupa[nr_grupy].dane),*ptr_rodzaj(grupa[nr_grupy].dane),
get_czesc_mowy_podmiot(),get_liczba_podmiot(),get_rodzaj_podmiot())==RESULT_NO_OK) return RESULT_NO_OK;
}
}
return RESULT_OK;
// jeôli okreôla bezokolicznik
case BEZOKOLICZNIK:
// czasownik musi byê w 3 osobie
if (*ptr_osoba(grupa[nr_grupy].dane)!=OSOBA_TY) return RESULT_NO_OK;
// czasownik w liczbie pojedynczej
if (*ptr_liczba(grupa[nr_grupy].dane)!=LICZBA_POJEDYNCZA) return RESULT_NO_OK;
return RESULT_OK;
default:
return RESULT_NO_OK;
}
}
char FROM orzeczenie_czasownikowe(void)
{
/*
orzeczenie okreôla czëôê zdania:
- podmiot
warunek ogólny:
- orzeczenie moûe byê tylko jedno
- orzeczenie moûe byê tylko na poziomie 1
orzeczenie czasownikowe/imienne to czëôê mowy:
- czasownik osobowy
<gdy okreôla rzeczownik>
- liczba ta sama co dla podmiotu
- rodzaj ten sam co podmiotu, ale:
- w czasie teraúniejszym czasownik nie uwzglëdnia rodzaju
- w liczbie mnogiej czasownika tylko dwa rodzaje
<gdy okreôla zaimek rzeczowny>
- liczba ta sama co dla podmiotu
- rodzaj ten sam co podmiotu, ale:
- w czasie teraúniejszym czasownik nie uwzglëdnia rodzaju
- w liczbie mnogiej czasownika tylko dwa rodzaje
- osoba zgodna z osobâ odpowiadajâcâ zaimkowi
<gdy okreôla bezokolicznik>
- czasownik w 3 osobie
- czasownik w liczbie pojedynczej
*/
char founded=0,nr_grupy;
for (nr_grupy=0;nr_grupy<sentence.ile_grup;nr_grupy++)
{
if (czy_orzeczenie_czasownikowe(nr_grupy)==RESULT_OK)
{
// orzeczenie moûe byê tylko jedno (kolejny nieômiertelny?)
if (founded==1)
{
if (view.skladnia==KOD_TRUE) con_put("bîâd: odnaleziono nadmiarowe orzeczenia\n");
return RESULT_NO_OK;
}
founded=1;
skladnia.funkcja[nr_grupy]=ORZECZENIE_CZASOWNIKOWE;
skladnia.orzeczenie=nr_grupy;
}
}
if (founded==1) return RESULT_OK;
return RESULT_NO_OK;
}